package in.model;
import in.lib.Debug;
import in.lib.manager.UserManager;
import in.model.base.Message;
import in.obj.annotation.Annotation.Type;
import in.obj.annotation.CrosspostAnnotation;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import android.os.Parcel;
import android.os.Parcelable;
import com.esotericsoftware.kryo.serializers.TaggedFieldSerializer.Tag;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
/**
* Serializable class for posts
*/
@ToString(includeFieldNames = true, callSuper = true)
public class Post extends Message
{
@Tag(0x01) @Getter @Setter private String originalId = "";
@Tag(0x02) @Getter @Setter private String threadId = "";
@Tag(0x03) @Getter @Setter private SimpleUser reposter;
@Tag(0x04) @Getter @Setter private boolean starred;
@Tag(0x05) @Getter @Setter private boolean repost;
@Tag(0x06) @Getter @Setter private Boolean hasReplies = false;
@Tag(0x07) @Getter @Setter private int replyCount;
@Tag(0x08) @Getter @Setter private int repostCount;
@Tag(0x09) @Getter @Setter private int starCount;
@Tag(0x0A) @Getter @Setter private boolean crossPost;
@Tag(0x0B) @Getter @Setter private String crossPostUrl = "";
@Tag(0x0C) @Getter @Setter private SimpleUser[] reposters = {};
@Tag(0x0D) @Getter @Setter private SimpleUser[] starrers = {};
@Override public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null || (obj != null && getClass() != obj.getClass()))
{
return false;
}
Post other = (Post)obj;
if (originalId == null)
{
if (other.originalId != null)
{
return false;
}
}
else if (!originalId.equals(other.originalId))
{
return false;
}
return true;
}
@Override public Post createFrom(JsonObject post)
{
return createFrom(post, UserManager.getUser(), false);
}
@Override public Post createFrom(JsonObject post, boolean allowDeleted)
{
return createFrom(post, UserManager.getUser(), allowDeleted);
}
@Override public Post createFrom(JsonObject post, User acc, boolean allowDeleted)
{
if (post.has("repost_of"))
{
setReposter(new SimpleUser().createFrom(post.get("user").getAsJsonObject()));
setOriginalId(post.get("id").getAsString());
setRepost(true);
post = post.get("repost_of").getAsJsonObject();
}
else
{
setOriginalId(post.get("id").getAsString());
}
if (super.createFrom(post, acc, allowDeleted) == null)
{
return null;
}
try
{
setThreadId(post.get("thread_id").getAsString());
setReplyCount(post.get("num_replies").getAsInt());
setHasReplies(replyCount > 0 || post.has("reply_to"));
setStarCount(post.get("num_stars").getAsInt());
setRepostCount(post.get("num_reposts").getAsInt());
setCanonicalUrl(post.get("canonical_url").getAsString());
if (post.has("you_starred"))
{
setStarred(post.get("you_starred").getAsBoolean());
}
if (getAnnotations() != null)
{
if (getAnnotations().containsKey(Type.CROSS_POST) && getAnnotations().get(Type.CROSS_POST).size() > 0)
{
CrosspostAnnotation crossPost = (CrosspostAnnotation)getAnnotations().get(Type.CROSS_POST).get(0);
setCrossPost(true);
setCrossPostUrl(crossPost.getUrl());
}
}
if (post.has("reposters"))
{
JsonArray reposters = post.get("reposters").getAsJsonArray();
SimpleUser[] postReposters = new SimpleUser[reposters.size()];
int index = 0;
for (JsonElement user : reposters)
{
SimpleUser reposter = new SimpleUser().createFrom(user.getAsJsonObject());
postReposters[index++] = reposter;
}
setReposters(postReposters);
}
if (post.has("starred_by"))
{
JsonArray starrers = post.get("starred_by").getAsJsonArray();
SimpleUser[] postStarrers = new SimpleUser[starrers.size()];
int index = 0;
for (JsonElement user : starrers)
{
SimpleUser starrer = new SimpleUser().createFrom(user.getAsJsonObject());
postStarrers[index++] = starrer;
}
setStarrers(postStarrers);
}
return this;
}
catch(Exception e)
{
Debug.out(e);
return null;
}
}
@Override public Post createFrom(Parcel object)
{
setOriginalId(object.readString());
setThreadId(object.readString());
setReposter((SimpleUser)object.readParcelable(SimpleUser.class.getClassLoader()));
setStarred((Boolean)object.readValue(null));
setRepost((Boolean)object.readValue(null));
setHasReplies((Boolean)object.readValue(null));
setReplyCount(object.readInt());
setRepostCount(object.readInt());
setStarCount(object.readInt());
setCrossPost((Boolean)object.readValue(null));
setCrossPostUrl(object.readString());
setReposters(new SimpleUser[object.readInt()]);
setStarrers(new SimpleUser[object.readInt()]);
object.readTypedArray(getReposters(), SimpleUser.CREATOR);
object.readTypedArray(getStarrers(), SimpleUser.CREATOR);
super.createFrom(object);
return this;
}
@Override public void writeToParcel(Parcel dest, int flags)
{
dest.writeString(getOriginalId());
dest.writeString(getThreadId());
dest.writeParcelable(getReposter(), 0);
dest.writeValue(isStarred());
dest.writeValue(isRepost());
dest.writeValue(getHasReplies());
dest.writeInt(getReplyCount());
dest.writeInt(getRepostCount());
dest.writeInt(getStarCount());
dest.writeValue(isCrossPost());
dest.writeString(getCrossPostUrl());
dest.writeInt(getReposters().length);
dest.writeInt(getStarrers().length);
dest.writeTypedArray(getReposters(), 0);
dest.writeTypedArray(getStarrers(), 0);
super.writeToParcel(dest, flags);
}
public static final Parcelable.Creator<Post> CREATOR = new Creator<Post>()
{
@Override public Post[] newArray(int size)
{
return new Post[size];
}
@Override public Post createFromParcel(Parcel source)
{
return new Post().createFrom(source);
}
};
}